package br.com.roboandar.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import br.com.roboandar.core.Estado;
import br.com.roboandar.core.Processador;
import br.com.roboandar.core.Tipo;

/**
 * Servlet implementation class Main
 */
public class IniciaMundo extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public IniciaMundo() {
        super();
    }
    
    

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		setMundoSession(request);
		execute(request);
		HashMap<Integer,Estado> mundo = getMundoSession(request);
		for (Estado e : mundo.values()) {
			System.out.println(e.getPosicao() + " _ " + e.getRecompensa());
		}
	}
	
	public void execute(HttpServletRequest request){
		String posicoes[] = request.getParameter("posicoes").split(",");
		Double rvazia = Double.parseDouble(request.getParameter("rvazia"));
		Double rmorte = Double.parseDouble(request.getParameter("rmorte"));
		Double rsaida = Double.parseDouble(request.getParameter("rsaida"));
		Double vaceitavel = Double.parseDouble(request.getParameter("vaceitavel"));
		Double fdesconto = Double.parseDouble(request.getParameter("fdesconto"));
		HashMap<Integer,Estado> mundo = getMundoSession(request);
		
		inicializaMundoPosicoesVazias(mundo, rvazia);
		posicionaElementosDoMundo(mundo, posicoes, rmorte, rsaida);
		System.out.println(vaceitavel);
		System.out.println(fdesconto);
		retornaMundoUtilidadesOtimas(mundo, vaceitavel, fdesconto);
		
	}
	
	public void retornaMundoUtilidadesOtimas(HashMap<Integer,Estado> mundo, Double vaceitavel, Double fdesconto){
		Processador processador = new Processador();
		processador.iteracaoValor(mundo, 1, 0);
	}
	
	public void posicionaElementosDoMundo(HashMap<Integer,Estado> mundo,String posicoes[],Double rmorte,Double rsaida){
		for (String string : posicoes) {
			String[] lista = string.split("=");
			
			int posicao = Integer.parseInt(lista[0]);
			String tipoObjeto = lista[1];
			
			if(!tipoObjeto.equals("Agente")){
				Tipo tipo = Tipo.valueOf(Tipo.class, tipoObjeto);
				if(tipo == Tipo.Morte)
					mundo.put(posicao, new Estado(posicao,rmorte,tipo));
				if(tipo == Tipo.Terminal)
					mundo.put(posicao, new Estado(posicao,rsaida,tipo));
				if(tipo == Tipo.Parede)
					mundo.put(posicao, new Estado(posicao,0,tipo));
			}
			
		}		
	}
	
	//Inicializa o mundo com todas as posicoes vazias
	public void inicializaMundoPosicoesVazias(HashMap<Integer,Estado> mundo, double recompensa){
		for (int i = 0; i < 4; i++) {
			int linha = i +1 ;
			for (int j = 0; j < 4; j++) {
				int coluna = j + 1;
				String posicao = String.valueOf(linha)+ String.valueOf(coluna);
				mundo.put(Integer.parseInt(posicao),
						new Estado(Integer.parseInt(posicao),recompensa,Tipo.Normal));
			}
		}
	}
	
	public HashMap<Integer,Estado> getMundoSession(HttpServletRequest request){
		HashMap<Integer,Estado> lista = (HashMap<Integer,Estado>)request.getSession().getAttribute("MUNDO");
		return lista;
	}
	
	public void setMundoSession(HttpServletRequest request){
		request.getSession().setAttribute("MUNDO",new HashMap<Integer,Estado>());
	}
	
}
